#coding=utf8

import allure
import pytest
import os
import inspect
from utils.readExcel import ReadExcel


class MyDecorater:

    # 装饰器功能：根据模块（PY文件）和模块中的方法名筛选用例，并自动为方法添加上@pytest.mark.parametrize装饰器
    # 使用方式：
    # class TestX:
    #     @my_parametrize(params="args",inputData=inputData)
    #     def test_firstmethod(self,args):
    #         print(args)
    #
    #     @my_parametrize(params="args",inputData=inputData)
    #     def test_secondmethod(self,args):
    #         print(args)

    # 其中参数必须要写成params=...，和inputData=...的形式
    # @my_parametrize(params="arg",dataBeforeFilter=[{},{},{}]) 相当于 @pytest.mark.parametrize("arg,[{},{},{}]),不同的是后者会根据模块和方法过滤输入数据
    @staticmethod
    def my_parametrize(**kwargs):

        def Middle(fun):
            # 根据方法获取其所在的模块py文件名
            modelName = os.path.split(inspect.getfile(fun))[-1]

            # 根据方法名和模块名过滤输入数据
            dataAfterFilter = ReadExcel.filter(modelName, fun.__name__, kwargs["dataBeforeFilter"])

            return pytest.mark.parametrize(kwargs["params"], dataAfterFilter)(fun)
        return Middle
